#include <iostream>
#include <set>
using namespace std;

set<int> s; // 存储已经占了一条铁轨的元素

int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        int input;
        cin >> input;
        set<int>::iterator it = s.lower_bound(input);
        if (it != s.end())
        {
            // s中有大于s的数字（可以把input放在他后面而不开一个新铁轨）
            // 使用lower_bound()函数找到最接近input的大于input的数（第一个大于input的数）（相当于对数组使用二分，但是用数组会多写排序和二分函数）
            // 这样可以让下一个input选择已有铁轨的可能性更大（找到比自己大的数的可能性更大）（最优解）
            s.erase(it); // 代表该铁轨的数字更新，为了让s的大小代表轨道数，删去比较的数字
        }
        s.insert(input); // 找到比input大的数size不变，找不到就会+1
    }
    cout << s.size();
    return 0;
}